﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TCC_Hotel.Serviços.OtherServices;
using TCC_Hotel.Entidades;
using TCC_Hotel.Serviços.BDServices;
using TCC_Hotel.Entidades.Basicas;

namespace TCC_Hotel.Apresentacao.Reservas
{
    public partial class EfetuarReservaHospedeParticular : System.Web.UI.Page
    {
        ReservaService servico = new ReservaService();
        string data_Inicial, data_Final, apartamento;
        int numeroHospedes, numeroApartamento;
        List<Reserva_Particular> listaReservas_Particulares;
        List<Reserva_Faturada> listaReservas_Faturadas;
        List<DiaNomeReserva> listaDiasReservas;

        /// <summary>
        /// Carregamento da página
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();
            LoginService servico_Login = new LoginService();
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Reservas)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }

            if (!IsPostBack)
            {
                //Se nao vier parametro, redireciona o usuario para a tela inicial
                if (Request.Params["dataInicial"] == null || Request.Params["dataFinal"] == null || Request.Params["numeroHospedes"] == null || Request.Params["apartamento"] == null)
                {
                    //Redireciona para a pagina inicial
                    Response.Redirect("~/");
                }

                //Recupera os parametros da URL
                data_Inicial = Request.Params["dataInicial"];
                data_Final = Request.Params["dataFinal"];
                numeroHospedes = Convert.ToInt32(Request.Params["numeroHospedes"]);                
                apartamento = Request.Params["apartamento"];

                //Preenche os campos automaticamente com os parametros vindos da tela anterior
                txtDataFinal.Text = data_Final;
                txtDataInicio.Text = data_Inicial;
                txtApartamento.Text = apartamento;


            }
        }

        /// <summary>
        /// Limpa todos os campos
        /// </summary>        
        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            txtNome.Text = null;
            txtCPFReserva.Text = null;
            txtRGReserva.Text = null;
            txtNumerocartao.Text = null;
            txtValidade.Text = null;
            txtCodigoSeguranca.Text = null;
            txtNomeCartao.Text = null;
            txtTelefone.Text = null;
            txtDDDTelefone.Text = null;
            txtNome2.Text = null;
            txtRG2.Text = null;
            txtNome3.Text = null;
            txtRG3.Text = null;
            txtNome4.Text = null;
            txtRG4.Text = null;
            txtNome5.Text = null;
            txtRG5.Text = null;

        }

        /// <summary>
        /// Evento de click do botão salvar
        /// </summary>
        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            numeroApartamento = Convert.ToInt32(Request.Params["numeroApartamento"]);

            ComumServices comum = new ComumServices();

            //preenche a lista obrigatoria para verificar se todos os campos obrigatorios foram preenchidos
            List<string> listaObrigatoria = new List<string>() 
            { 
                txtNome.Text.Trim(),
                txtCPFReserva.Text,
                txtRGReserva.Text, 
                txtNumerocartao.Text,
                txtValidade.Text,
                txtCodigoSeguranca.Text,
                txtTelefone.Text,
                txtDDDTelefone.Text,
                txtNomeCartao.Text.Trim()
                            
            };

            //verifica se algum campo obrigatorio nao foi preenchido
            if (!comum.ValidaCamposObrigatorios(listaObrigatoria))
            {
                MensagemJS("ERRO: Campo(s) obrigatório(s) em branco");
                return;
            }
           

            //faz a validação da data de validade do cartão          
            if (!comum.ValidaDataVencimentoCartao(txtValidade.Text))
            {
                MensagemJS("ERRO: Data inválida ou com vencimento maior que 10 anos");
                return;
            }

            //Faz validação do CPF
            if (!comum.ValidaCPF(txtCPFReserva.Text))
            {
                MensagemJS("ERRO: CPF digitado não é válido");
                return;
            }

            //Faz validação dos Rgs e nomes
            List<string> RGs = new List<string>();
            List<string> Nomes = new List<string>();

            Nomes.Add(txtNome2.Text);
            Nomes.Add(txtNome3.Text);
            Nomes.Add(txtNome4.Text);
            Nomes.Add(txtNome5.Text);

            RGs.Add(txtRG2.Text);
            RGs.Add(txtRG3.Text);
            RGs.Add(txtRG4.Text);
            RGs.Add(txtRG5.Text);


            if (!comum.ValidaNomesRG(RGs, Nomes))
            {
                MensagemJS("ERRO: Para cada RG digitado, deve-se preencher um nome");
                return;
            }

            //Faz validação do RG de reserva            
            if (!comum.ValidaRG(txtRGReserva.Text) || !comum.ValidaRG(txtRG2.Text) || !comum.ValidaRG(txtRG3.Text) || !comum.ValidaRG(txtRG4.Text) || !comum.ValidaRG(txtRG5.Text))
            {
                MensagemJS("ERRO: RG(s) digitado(s) não é(são) válido(s)");
                return;
            }

            //Faz validação dos telefones
            List<string> DDDs = new List<string>();
            List<string> Telefones = new List<string>();

            Telefones.Add(txtTelefone.Text);   
            DDDs.Add(txtDDDTelefone.Text);           

            //Chama o serviço que valida o telefone
            if (!comum.ValidaTelefones(DDDs, Telefones))
            {
                MensagemJS("ERRO: Telefone digitado não é válido");
                return;
            }

            //recupera todas as reservas para verificar a disponibilidade do hotel
            listaReservas_Particulares = servico.RecuperarReservasParticularesApartamento(Convert.ToInt32(numeroApartamento));
            listaReservas_Faturadas = servico.RecuperarReservasFaturadasApartamento(Convert.ToInt32(numeroApartamento));
            listaDiasReservas = servico.ListarDiasReservas(listaReservas_Particulares, listaReservas_Faturadas);

            //Chama o serviço que valida o telefone
            if (!servico.VerificaDisponibilidade(txtDataInicio.Text, txtDataFinal.Text, listaDiasReservas))
            {
                MensagemJS("ERRO: Data indisponível no momento");
                return;
            }

            //monta o objeto reserva com os valores digitados do usuário
            try
            {
                Reserva_Particular reserva = new Reserva_Particular()
                {
                    CPF_Reserva = txtCPFReserva.Text,
                    RG_Reserva = txtRGReserva.Text,
                    Nome_Reserva = txtNome.Text,
                    Telefone = (txtDDDTelefone.Text + txtTelefone.Text),
                    Nome_2 = txtNome2.Text,
                    RG_2 = txtRG2.Text,
                    Nome_3 = txtNome3.Text,
                    RG_3 = txtRG3.Text,
                    Nome_4 = txtNome4.Text,
                    RG_4 = txtRG4.Text,
                    Nome_5 = txtNome5.Text,
                    RG_5 = txtRG5.Text,
                    Data_Inicio = Convert.ToDateTime(txtDataInicio.Text),
                    Data_Final = Convert.ToDateTime(txtDataFinal.Text),
                    Numero_Apartamento = numeroApartamento,
                    
                    Cartao_Credito = new Cartao()
                    {
                        Bandeira = ddlBandeira.SelectedValue,
                        Codigo_Seguranca = Convert.ToInt32(txtCodigoSeguranca.Text),
                        Nome = txtNomeCartao.Text,
                        Numero = txtNumerocartao.Text,
                        Validade = Convert.ToDateTime(txtValidade.Text)

                    }

                };


                //chama o serviço que insere o funcionário no banco de dados
                if (servico.EfetuarReservaParticular(reserva))
                {
                    MensagemJS("Reserva efetuada com sucesso!");
                    AposEfetuar();
                   
                }
                else
                {
                    MensagemJS("ERRO: Ocorreu um erro!");
                    return;
                }

            }
            catch (Exception)
            {
                //se ocorrer exceção lanca mensagem para o usuário
                MensagemJS("ERRO: Campo(s) com valor(es) inválido(s)");
                return;

            }
        }

        /// <summary>
        /// Evento após completar o efetuar reserva
        /// </summary>
        public void AposEfetuar()
        {
            HttpContext.Current.Cache.Remove("Lista_Reserva_Particular");
            HttpContext.Current.Cache.Remove("Lista_Reserva_Faturada");
            txtNome.Enabled = false;
            txtCPFReserva.Enabled = false;
            txtRGReserva.Enabled = false;
            txtNumerocartao.Enabled = false;
            txtValidade.Enabled = false;
            txtCodigoSeguranca.Enabled = false;
            txtNomeCartao.Enabled = false;
            txtTelefone.Enabled = false;
            txtDDDTelefone.Enabled = false;
            txtNome2.Enabled = false;
            txtRG2.Enabled = false;
            txtNome3.Enabled = false;
            txtRG3.Enabled = false;
            txtNome4.Enabled = false;
            txtRG4.Enabled = false;
            txtNome5.Enabled = false;
            txtRG5.Enabled = false;
            btnSalvar.Visible = false;
            btnLimpar.Visible = false;
            ddlBandeira.Enabled = false;
            btnBuscaHospede1.Enabled = false;
            btnBuscaHospede2.Enabled = false;
            btnBuscaHospede3.Enabled = false;
            btnBuscaHospede4.Enabled = false;
            btnBuscaHospede5.Enabled = false;
        }

        /// <summary>
        /// Even]to de click do botao voltar 
        /// </summary>
        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            numeroHospedes = Convert.ToInt32(Request.Params["numeroHospedes"]);
            apartamento = Request.Params["apartamento"];
            Response.Redirect("~/Apresentacao/Reservas/MapaReservas.aspx?apartamentoCorrente=" + apartamento + "&numeroHospedeCorrente=" + numeroHospedes);
        }

        /// <summary>
        /// Evento de click para buscaar as informações do hóspede principal
        /// </summary>
        protected void btnBuscaHospede1_Click(object sender, EventArgs e)
        {
            HospedeService servico_Hospede = new HospedeService();
            string RG = txtRGReserva.Text;

            //recupera o hospede cadastrado pelo RG
            HospedeParticular hospede = servico_Hospede.RecuperarDetalhesHospedeParticularPorRG(RG);

            if (hospede != null)
            {
                //preenche os campos
                txtCPFReserva.Text = hospede.CPF;
                txtNome.Text = hospede.Nome;

                if (!String.IsNullOrEmpty(hospede.Contato.Telefone[0]))
                {
                    txtDDDTelefone.Text = hospede.Contato.Telefone[0].Substring(0, 2);
                    txtTelefone.Text = hospede.Contato.Telefone[0].Substring(2);
                }
            }
            else
            {
                MensagemJSClassico("RG não cadastrado!");
            }
        
        }
        /// <summary>
        /// Evento de click para buscaar as informações do hóspede 
        /// </summary>
        protected void btnBuscaHospede2_Click(object sender, EventArgs e)
        {
            HospedeService servico_Hospede = new HospedeService();
            string RG = txtRG2.Text;

            //recupera o hospede cadastrado pelo RG
            HospedeParticular hospede = servico_Hospede.RecuperarDetalhesHospedeParticularPorRG(RG);

            if (hospede != null)
            {
                txtNome2.Text = hospede.Nome;
            }
            else
            {
                MensagemJSClassico("RG não cadastrado!");
            }

        }

        /// <summary>
        /// Evento de click para buscaar as informações do hóspede 
        /// </summary>
        protected void btnBuscaHospede3_Click(object sender, EventArgs e)
        {
            HospedeService servico_Hospede = new HospedeService();
            string RG = txtRG3.Text;

            //recupera o hospede cadastrado pelo RG
            HospedeParticular hospede = servico_Hospede.RecuperarDetalhesHospedeParticularPorRG(RG);

            if (hospede != null)
            {
                txtNome3.Text = hospede.Nome;
            }
            else
            {
                MensagemJSClassico("RG não cadastrado!");
            }
        }

        /// <summary>
        /// Evento de click para buscaar as informações do hóspede 
        /// </summary>
        protected void btnBuscaHospede4_Click(object sender, EventArgs e)
        {
            HospedeService servico_Hospede = new HospedeService();
            string RG = txtRG4.Text;

            //recupera o hospede cadastrado pelo RG
            HospedeParticular hospede = servico_Hospede.RecuperarDetalhesHospedeParticularPorRG(RG);

            if (hospede != null)
            {
                txtNome4.Text = hospede.Nome;
            }
            else
            {
                MensagemJSClassico("RG não cadastrado!");
            }
        }

        /// <summary>
        /// Evento de click para buscaar as informações do hóspede 
        /// </summary>
        protected void btnBuscaHospede5_Click(object sender, EventArgs e)
        {
            HospedeService servico_Hospede = new HospedeService();
            string RG = txtRG5.Text;

            //recupera o hospede cadastrado pelo RG
            HospedeParticular hospede = servico_Hospede.RecuperarDetalhesHospedeParticularPorRG(RG);

            if (hospede != null)
            {
                txtNome5.Text = hospede.Nome;
            }
            else
            {
                MensagemJSClassico("RG não cadastrado!");
            }
        }

        /// <summary>
        /// Lança um popup em javaScript com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJS(string msg)
        {
            //Formata um alert para o usuário
            Page.ClientScript.RegisterStartupScript(

                     this.GetType(),

                     "error",

                     "$(window).load(function(){alert('" + msg + "')});",

                     true);

        }

        /// <summary>
        /// Lança um popup em javaScript classico com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJSClassico(string msg)
        {
            //Formata um alert para o usuário
            ScriptManager.RegisterStartupScript(this,

                    this.GetType(),

                    "Mensagem",

                    string.Format("alert" + "('" + msg + "')"),

                    true);

        }
    }
}